# 不定长参数
# 定义一个函数，可以求任意个数数字的和


# 在定义函数时，可以在形参前加上*，这样的形参将会获取到所有的实参
# 它会将所有的实参保存到一个元组中
def sum(*nums):
    result = 0
    for i in nums:
        result += i
    print(result)


sum(100, 200, 300)
print('====================================================')


# 带星号的形参只能有一个
# 带星号的形参，可以和其他形参配合使用


def fn(a, b, *c):
    print('a = ', a)
    print('b = ', b)
    print('c = ', c)


fn(100, 200, 300, 500, 1000)
print('====================================================')


# 可变参数不是必须要写在最后，但是需要注意的是，带*的参数后的所有参数，必须以关键字参数的形式传递


def fn2(a, *b, c):
    print('a = ', a)
    print('b = ', b)
    print('c = ', c)


fn2(100, 200, 300, 400, 500, c=600)
print('====================================================')


# 所有的参数都给a，b和c必须使用关键字参数


def fn3(*a, b, c):
    print('a = ', a)
    print('b = ', b)
    print('c = ', c)


fn3(100, 200, 300, 400, b=500, c=600)
print('====================================================')


# 如果在形参的开头写一个*，则要求我们所有的形参都必须以关键字参数的形式传递


def fn4(*, a, b, c):
    print('a = ', a)
    print('b = ', b)
    print('c = ', c)


fn4(a=100, b=200, c=400)
print('====================================================')


# *形参只能接收位置参数，不能接收关键字参数


def fn5(*a):
    print(a)


# fn5(b=2, c=4, d=5)
print('====================================================')


# **形参可以接收其他的关键字参数,它会将这些参数保存在一个字典中
# 字典的key就是参数的名字，字典的value就是参数的值
# **形参只能有一个，并且必须写在所有参数的最后


def fn6(b, c, **a):
    print(a, type(a))
    print(b, type(b))
    print(c, type(c))


fn6(b=2, c=4, d=5, e=10, f=20)

print('====================================================')


# 参数解包
def fn7(a, b, c):
    print('a =', a)
    print('b =', b)
    print('c =', c)


# 创建一个元组
t = (100, 300, 500)

# 传递实参的时候，也可以在序列类型的参数前添加星号，这样它就会自动将序列中的元素依次作为参数传递
# 这里要求序列中的元素个数必须要和形参的个数一致
fn7(*t)
print('====================================================')
# 创建一个字典
d = {'a': 100, 'b': 200, 'c': 300}
# 通过**来对一个字典进行解包
fn7(**d)
